from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.hashers import check_password
from django.db import models
from django.utils import timezone

from problems.models.problem_model import ProblemModel


class User(AbstractBaseUser):
    """
    用户类

    用途：
    该模型记录用户信息

    关联关系：
    - 与提交记录（Submission）是一对多关系
    - 与收藏题目（UserFavoriteProblem）是一对多关系

    创建人：
    魏文海，创建于2024年7月26日
    """
    # 基本信息
    username = models.CharField(max_length=16, verbose_name="账号", unique=True)
    password = models.CharField(max_length=128, verbose_name="密码")
    email = models.EmailField(verbose_name="邮箱", unique=True)
    nick_name = models.CharField(max_length=32, verbose_name="昵称", blank=True)
    avatar = models.CharField(max_length=256, verbose_name="头像", blank=True)
    
    # 用户状态
    is_active = models.BooleanField(default=True, verbose_name="是否激活")
    is_staff = models.BooleanField(default=False, verbose_name="是否是管理员")
    
    # 积分和等级
    points = models.IntegerField(default=0, verbose_name="积分")
    level = models.IntegerField(default=1, verbose_name="等级")
    
    # 时间相关
    date_joined = models.DateTimeField(default=timezone.now, verbose_name="注册时间")
    last_login = models.DateTimeField(null=True, blank=True, verbose_name="最后登录时间")
    
    # 统计信息
    total_submissions = models.IntegerField(default=0, verbose_name="总提交次数")
    accepted_submissions = models.IntegerField(default=0, verbose_name="通过的提交次数")
    solved_problems = models.IntegerField(default=0, verbose_name="解决的题目数")

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']

    class Meta:
        db_table = 'users'
        verbose_name = '用户信息'
        verbose_name_plural = verbose_name

    def update_statistics(self):
        """更新用户的统计信息"""
        from submission.models.submission_model import SubmissionModel
        
        # 更新提交统计
        self.total_submissions = SubmissionModel.objects.filter(
            user=self,
            is_delete=False
        ).count()
        
        # 计算通过的提交（result=3 表示通过）
        self.accepted_submissions = SubmissionModel.objects.filter(
            user=self,
            is_delete=False,
            result=3  # 3 表示通过
        ).count()
        
        # 计算解决的不同题目数量
        self.solved_problems = SubmissionModel.objects.filter(
            user=self,
            is_delete=False,
            result=3  # 3 表示通过
        ).values('problem').distinct().count()
        
        # 计算等级和积分
        self.points = self.accepted_submissions * 10  # 每道题10分
        self.level = max(1, self.solved_problems // 10)  # 每10道题升一级
        
        self.save()

    def get_full_name(self):
        return self.nick_name or self.username

    def get_short_name(self):
        return self.username

    def __str__(self):
        return self.username


class UserFavoriteProblem(models.Model):
    """
    用户收藏的题目

    用途：
    记录用户收藏的题目信息

    关联关系：
    - 与用户（User）是多对一关系
    - 与题目（Problem）是多对一关系
    """
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="用户")
    problem = models.ForeignKey(ProblemModel, on_delete=models.CASCADE, verbose_name="题目")
    created_time = models.DateTimeField(default=timezone.now, verbose_name="收藏时间")
    notes = models.TextField(blank=True, verbose_name="笔记")

    class Meta:
        db_table = 'user_favorite_problems'
        verbose_name = '用户收藏题目'
        verbose_name_plural = verbose_name
        unique_together = ['user', 'problem']  # 同一用户不能重复收藏同一题目

    def __str__(self):
        return f"{self.user.username} - {self.problem.title}"
